package com.zy.study.config;

import com.zy.study.service.FunctionAssistant;
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.request.json.JsonObjectSchema;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.tool.ToolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

@Configuration
public class LLMConfig {
    @Bean
    public ChatModel chatModel() {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("aliQwen-api"))
                .modelName("qwen-plus")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
    }

    //创建一个工具类
    @Bean
    public FunctionAssistant functionAssistant(ChatModel chatModel)
    {
        // 工具说明 ToolSpecification
        //向大模型声明一个工具的元信息（名称、描述、参数要求），让大模型知道 “如何调用这个工具”
        ToolSpecification toolSpecification = ToolSpecification.builder()
                .name("开具发票助手")// 工具名称，大模型用它识别要调用的工具
                .description("根据用户提交的开票信息，开具发票")// 工具描述，帮助大模型判断何时调用
                .parameters(JsonObjectSchema.builder()
                        .addStringProperty("companyName", "公司名称")
                        .addStringProperty("dutyNumber", "税号序列")
                        .addStringProperty("amount", "开票金额，保留两位有效数字")
                        .build())
                .build();


        // 业务逻辑 ToolExecutor
        //定义工具被调用时的实际执行逻辑（这里只是模拟打印和返回固定结果，真实场景需对接发票系统）
        //LangChain4j 中的函数式接口，用于定义 “当工具被调用时要执行的逻辑”
        //toolExecutionRequest：工具调用请求对象，包含调用工具的所有信息（如工具 ID、名称、参数等）
        //memoryId：对话记忆唯一标识（如用户 ID）
        ToolExecutor toolExecutor = (toolExecutionRequest, memoryId) -> {
            System.out.println(toolExecutionRequest.id());
            System.out.println(toolExecutionRequest.name());
            String arguments1 = toolExecutionRequest.arguments();
            System.out.println("arguments1****》 " + arguments1);
            return "开具成功";
        };

        return AiServices.builder(FunctionAssistant.class)
                .chatModel(chatModel)
                .tools(Map.of(toolSpecification, toolExecutor)) // Tools (Function Calling)
                .build();
    }
}
